package qc.module.qms.api.controller;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import qc.common.core.exception.QCPromptException;
import qc.module.platform.dto.db.DBConnectionDto;
import qc.module.qms.api.RestTemplatePlatform;
import qc.module.qms.dto.rawdata.QmsRawDataSyncManualConditionDto;
import qc.module.qms.dto.rawdata.QmsRawDataSyncResultDto;
import qc.module.qms.entity.QmsRawdataSync;
import qc.module.qms.service.rawdata.QmsRawdataSyncService;

import java.util.HashMap;

/**
 * 原始数据同步Controller
 *
 * @author QuCheng Tech
 * @since 2025/11/24
 */
@RestController
@RequestMapping("/rawdatasync")
public class QmsRawDataSyncController {
    private static final Logger logger = LoggerFactory.getLogger(QmsRawDataSyncController.class);

    @Autowired
    private QmsRawdataSyncService service;

    @Autowired
    private RestTemplatePlatform restTemplatePlatform;

    /**
     * 维护一个数据库表编码和数据库连接信息对应关系集合，如果接收到的原始数据库表编码没有数据库连接信息调用platform中的接口获取
     */
    private static HashMap<String, DBConnectionDto> tableCodeConnectionMap;

    /**
     * 人工操作进行原始数据同步
     *
     * @param condition 人工操作的同步条件
     * @return qc.module.qms.dto.rawdata.QmsRawDataSyncResultDto
     * @author QuCheng Tech
     * @since 2025/11/24
     */
    @RequestMapping(value = "/manual", method = {RequestMethod.POST, RequestMethod.GET})
    public QmsRawDataSyncResultDto manualSync(@RequestBody QmsRawDataSyncManualConditionDto condition) {
        //先初始化返回结果，设置是否成功标记为true
        QmsRawDataSyncResultDto result = new QmsRawDataSyncResultDto();
        result.setSuccess(true);

        //验证输入的条件是否正确
        if (condition == null) {
            result.setSuccess(false);
            result.setMsg("人工进行原始数据同步操作对象不能为空");

            return result;
        }
        String tableCode = condition.getTableCode();
        if (StringUtils.isBlank(tableCode)) {
            result.setSuccess(false);
            result.setMsg("人工进行原始数据同步操作的来源数据库表不能为空");

            return result;
        }
        //人工操作进行同步的起始值必须有，截止值可以为空
        if (StringUtils.isBlank(condition.getBeginControlValue())) {
            result.setSuccess(false);
            result.setMsg("人工进行原始数据同步操作的起始记录ID或时间不能为空");

            return result;
        }

        //获取同步entity并验证配置是否正确
        QmsRawdataSync syncEntity = service.getEntity(tableCode);
        result = service.validRawDataSyncConfig(syncEntity);
        if (result.isSuccess() == false)
            return result;

        //根据同步配置获取来源数据库表和目标数据库表连接信息
        DBConnectionDto srcCon = null;
        DBConnectionDto destCon = null;
        try {
            srcCon = this.getTableConnection(syncEntity.getTablecode());
        } catch (QCPromptException e) {
            result.setSuccess(false);
            result.setMsg("获取同步的来源数据库连接信息异常，" + e.getMessage());

            return result;
        }
        try {
            destCon = this.getTableConnection(syncEntity.getDesttablecode());
        } catch (QCPromptException e) {
            result.setSuccess(false);
            result.setMsg("获取同步的目标数据库连接信息异常，" + e.getMessage());

            return result;
        }
        if (srcCon == null) {
            result.setSuccess(false);
            result.setMsg("获取同步的来源数据库连接信息为空");

            return result;
        }
        if (destCon == null) {
            result.setSuccess(false);
            result.setMsg("获取同步的目标数据库连接信息为空");

            return result;
        }

        return service.manualSyncDatas(syncEntity, srcCon, destCon, condition.getBeginControlValue(), condition.getEndControlValue());
    }

    /**
     * 根据指定的原始数据表编码获取对应的数据库连接；如果在保存的数据库连接Map中已有对应返回已有，如果没有调用platform接口获取后缓存到Map中
     *
     * @param tableCode 原始数据表编码
     * @return qc.module.platform.dto.db.DBConnectionDto
     * @author QuCheng Tech
     * @since 2025/11/1
     */
    DBConnectionDto getTableConnection(String tableCode) throws QCPromptException {
        if (StringUtils.isNotBlank(tableCode)) {
            if (tableCodeConnectionMap == null)
                tableCodeConnectionMap = new HashMap<>();

            //如果根据key存在已有的数据库连接，直接返回
            if (tableCodeConnectionMap.size() > 0x0 && tableCodeConnectionMap.containsKey(tableCode))
                return tableCodeConnectionMap.get(tableCode);

            //根据key获取不到已有的数据库连接，调用platform获取数据库连接信息
            DBConnectionDto tableConnection = restTemplatePlatform.getDbTableConnectionInfo(tableCode);
            if (tableConnection != null) {
                tableCodeConnectionMap.put(tableCode, tableConnection);

                return tableConnection;
            }
        }

        return null;
    }
}
